/********************************************
 * 功能说明: 生成基类
 * 模块名称: 生成模块
 * 系统名称: java敏捷开发通用平台
 * 软件版权:
 * 系统版本: 1.0.0
 * 开发人员: zhangfb
 * 开发时间: 2017年7月14日 下午1:52:29
 * 审核人员:
 * 相关文档:
 * 修改记录: 修改日期 修改人员 修改说明
 *********************************************/
package com.hyacinth.database.mybatis.generator;

import com.hyacinth.database.mybatis.generator.template.Template;
import com.hyacinth.utils.file.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 生成基类
 * @author zhangfb
 * @version 1.0.0.1
 */
public abstract class BaseGenerator {
	
	protected static Logger logger = LoggerFactory.getLogger(BaseGenerator.class);
	
	protected String tempType = "java";//模板类型
	protected String fileName = null;//文件名称
	protected String javaType = "class";//JAVA类型
	protected String javaName = null;//JAVA名称
	protected String className = null;//类名称
	protected String moduleName = null;//模块名称
	protected String packageName = null;//包名称
	protected List<String> importList = new ArrayList<String>();
	
	// 初始化
	public void init() {
		
	}
	
	// 执行生成
	public void execute() {
		init();
		String filePath = getFilePath();
		File file = FileUtils.getFile(filePath);
		if (file == null) {
			logger.info("文件创建失败！filePath=" + filePath);
			return;
		}
		
		// 读取模板内容
		Template template = getTemplate();
		// 生成字段内容
		String fieldContent = getFieldContent();
		// 生成字段内容
		String methodContent = getMethodContent();
		
		// 更新替换参数
		template.put("${fileName}", fileName);
		template.put("${javaType}", javaType);
		template.put("${javaName}", javaName);
		template.put("${className}", className);
		template.put("${moduleName}", moduleName);
		template.put("${packageName}", packageName);
		template.put("${fieldContent}", fieldContent);
		template.put("${methodContent}", methodContent);
		if (importList.size() > 0) {
			StringBuilder sb = new StringBuilder("\r\n");
			for (String item : importList) {
				sb.append(item + "\r\n");
			}
			template.put("${importList}", sb.toString());
		}
		addTemplateParams(template);
		// 生成文件内容
		String fileContent = template.dealContent();
		try {
			// 写入文件
			FileUtils.write(file, fileContent);
			// 读取文件
			fileContent = FileUtils.readFileToString(file);
			logger.info("fileContent=\r\n" + fileContent);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 增加替换参数
	 * @return
	 */
	protected void addTemplateParams(Template template) {
		
	}
	
	/**
	 * 生成字段内容
	 * @return
	 */
	protected String getFieldContent() {
		return null;
	}
	
	/**
	 * 生成方法内容
	 * @return
	 */
	protected String getMethodContent() {
		return null;
	}

	/**
	 * 根据文件路径创建文件
	 * @param filePath
	 * @return
	 */
	public static File createFile(String filePath) {
		File file = new File(filePath);
		if (file.exists()) {
			logger.info("文件存在，请手动删除！");
			return null;
		}
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
		}
		try {
			file.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return file;
	}
	
	/**
	 * 获取文件路径
	 * @return
	 */
	public String getFilePath() {
		return getFilePath(null);
	}
	
	/**
	 * 获取文件路径
	 * @param buildPath
	 * @return
	 */
	public String getFilePath(String buildPath) {
		String userPath = System.getProperty("user.dir");
		
		if (buildPath == null) {
			if (fileName.lastIndexOf(".xml") < 0) {
				buildPath = "src/main/java";
			} else {
				buildPath = "src/main/resources";
			}
			
		}
		buildPath = buildPath.replace('/', File.separatorChar);
		String packagePath = packageName.replace('.', File.separatorChar);
		logger.info(packageName);
		
		String filePath = userPath + File.separatorChar + buildPath + File.separatorChar + packagePath + File.separatorChar + fileName;
		
		return filePath;
	}
	
	/**
	 * 获取模板内容
	 * @return
	 */
	public Template getTemplate() {
		return new Template(tempType);
	}
	
	/**
	 * 设置模板类型
	 * @param tempType
	 */
	public void setTempType(String tempType) {
		this.tempType = tempType;
	}
	
	/**
	 * 设置文件名称
	 * @param fileName
	 */
	public void setFileName(String fileName) {
		this.fileName = fileName;
		String[] array = fileName.split("\\.");
		this.javaName = array[0];
	}
	
	/**
	 * 设置Java类型
	 * @param javaType
	 */
	public void setJavaType(String javaType) {
		this.javaType = javaType;
	}
	
	/**
	 * 设置类名称
	 * @param className
	 */
	public void setClassName(String className) {
		this.className = className;
	}
	
	/**
	 * 设置模块名称
	 * @param moduleName
	 */
	public void setModuleName(String moduleName) {
		this.moduleName = moduleName;
	}

	/**
	 * 设置包名称
	 * @param packageName
	 */
	public void setPackageName(String packageName) {
		this.packageName = packageName;
	}

}
